package webcan

import (
    "fmt"
    "github.com/use-go/onvif"
    "github.com/use-go/onvif/ptz"
    "github.com/use-go/onvif/media" // 新增媒体服务导入
)

// 初始化ONVIF设备并返回PTZ服务客户端
func InitPTZDevice(deviceAddr, username, password string) (*onvif.Device, ptz.PTZ, error) {
    // 创建设备实例（需替换为实际设备地址）
    device, err := onvif.NewDevice(deviceAddr, username, password)
    if err != nil {
        return nil, nil, fmt.Errorf("设备连接失败: %v", err)
    }

    // 获取PTZ服务（需设备支持PTZ功能）
    ptzService, err := device.GetPTZService()
    if err != nil {
        return nil, nil, fmt.Errorf("设备不支持PTZ服务: %v", err)
    }

    return device, ptzService, nil
}

// 控制PTZ相对移动（上下左右/变焦）
func PTZRelativeMove(ptzService ptz.PTZ, profileToken string, pan, tilt, zoom float64) error {
    // 构造速度参数（范围通常-1到1，具体看设备能力）
    speed := ptz.PTZSpeed{
        PanTilt: ptz.Vector2D{X: pan, Y: tilt},
        Zoom:    ptz.Vector1D{X: zoom},
    }

    // 执行相对移动（相对于当前位置偏移）
    return ptzService.RelativeMove(ptz.PTZRelativeMove{
        ProfileToken: profileToken, // 从设备媒体配置获取的ProfileToken
        Speed:        speed,
    })
}

// 新增：获取设备媒体配置文件的ProfileToken列表
func GetProfileTokens(device *onvif.Device) ([]string, error) {
    // 获取媒体服务客户端
    mediaService, err := device.GetMediaService()
    if err != nil {
        return nil, fmt.Errorf("设备不支持媒体服务: %v", err)
    }

    // 获取设备所有媒体配置文件
    profiles, err := mediaService.GetProfiles()
    if err != nil {
        return nil, fmt.Errorf("获取媒体配置失败: %v", err)
    }

    // 提取所有Profile的Token
    var tokens []string
    for _, p := range profiles {
        tokens = append(tokens, p.Token)
    }
    return tokens, nil
}

// 停止PTZ所有动作
func PTZStop(ptzService ptz.PTZ, profileToken string) error {
    return ptzService.Stop(ptz.PTZStop{
        ProfileToken: profileToken,
        PanTilt:      true, // 停止平移倾斜
        Zoom:         true, // 停止变焦
    })
}

// 设置预置位（需先移动到目标位置再调用）
func SetPTZPreset(ptzService ptz.PTZ, profileToken, presetName, presetToken string) error {
    return ptzService.SetPreset(ptz.SetPreset{
        ProfileToken: profileToken,
        PresetName:   presetName,
        PresetToken:  presetToken, // 预置位索引（如"1"）
    })
}

// 调用预置位
func GotoPTZPreset(ptzService ptz.PTZ, profileToken, presetToken string, panSpeed, tiltSpeed, zoomSpeed float64) error {
    return ptzService.GotoPreset(ptz.GotoPreset{
        ProfileToken: profileToken,
        PresetToken:  presetToken,
        Speed: ptz.PTZSpeed{
            PanTilt: ptz.Vector2D{X: panSpeed, Y: tiltSpeed},
            Zoom:    ptz.Vector1D{X: zoomSpeed},
        },
    })
}